package com.laboki.eclipse.plugin.smartsave.preferences.ui; import java.util.ArrayList; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableItem; import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; import com.laboki.eclipse.plugin.smartsave.contexts.EditorContext; import com.laboki.eclipse.plugin.smartsave.events.ContentFilterQueryUpdatedEvent; import com.laboki.eclipse.plugin.smartsave.events.PreferencesWidgetDisposedEvent; import com.laboki.eclipse.plugin.smartsave.instance.Instance; import com.laboki.eclipse.plugin.smartsave.main.EventBus; import com.laboki.eclipse.plugin.smartsave.task.AsyncTask; public final class ContentTypeTableViewer implements Instance { static final CheckStateListener LISTENER = new CheckStateListener(); protected CheckboxTableViewer viewer; private final ContentTypeBlacklistUpdater blacklistUpdater = new ContentTypeBlacklistUpdater(); private final ContentTypeFilter searchFilter = new ContentTypeFilter(); public ContentTypeTableViewer(final Composite parent) { this.viewer = CheckboxTableViewer.newCheckList(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.MULTI); this.setlayout(); this.setProperties(); this.setDefaultChecks(); } private void setlayout() { final GridData data = new GridData(); data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL; data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true; data.heightHint = this.getHeightHint(); this.viewer.getTable().setLayoutData(data); } private int getHeightHint() { return this.viewer.getControl().getShell().getMonitor().getClientArea().height / 8; } private void setProperties() { this.viewer.setContentProvider(ArrayContentProvider.getInstance()); this.viewer.setFilters(new ViewerFilter[] { this.searchFilter }); this.viewer.setInput(EditorContext.getContentTypes()); this.viewer.setLabelProvider(new ContentTypeLabelProvider()); this.viewer.getTable().setLinesVisible(true); } private void setDefaultChecks() { this.viewer.setAllChecked(true); final ArrayList<String> blacklist = EditorContext.getBlacklist(); for (final Object element : this.viewer.getCheckedElements()) if (ContentTypeTableViewer.isBlacklisted(blacklist, element)) this.viewer.setChecked(element, false); } static boolean isBlacklisted(final ArrayList<String> blacklist, final Object element) { return blacklist.contains(((IContentType) element).getId()); } @Override public Instance start() { EventBus.register(this); this.blacklistUpdater.start(); this.searchFilter.start(); this.viewer.refresh(); this.viewer.getControl().setFocus(); this.addListeners(); return this; } private void addListeners() { this.viewer.addCheckStateListener(ContentTypeTableViewer.LISTENER); } @Override public Instance stop() { EventBus.unregister(this); this.searchFilter.stop(); this.blacklistUpdater.stop(); this.removeListeners(); this.viewer = null; return this; } private void removeListeners() { this.viewer.removeCheckStateListener(ContentTypeTableViewer.LISTENER); } @Subscribe @AllowConcurrentEvents public void eventHandler(final PreferencesWidgetDisposedEvent event) { this.stop(); } @Subscribe @AllowConcurrentEvents public void eventHandler(final ContentFilterQueryUpdatedEvent event) { new AsyncTask() { @Override public void execute() { ContentTypeTableViewer.this.viewer.refresh(true, true); this.toggleChecks(); } private void toggleChecks() { ContentTypeTableViewer.this.viewer.removeCheckStateListener(ContentTypeTableViewer.LISTENER); this.iterateElements(); ContentTypeTableViewer.this.viewer.addCheckStateListener(ContentTypeTableViewer.LISTENER); } private void iterateElements() { final ArrayList<String> blacklist = EditorContext.getBlacklist(); for (final TableItem tableItem : ContentTypeTableViewer.this.viewer.getTable() .getItems()) this.toggleElement(blacklist, tableItem.getData()); } private void toggleElement(final ArrayList<String> blacklist, final Object element) { if (ContentTypeTableViewer.isBlacklisted(blacklist, element)) this.uncheck(element); else this.check(element); } private void uncheck(final Object element) { ContentTypeTableViewer.this.viewer.setChecked(element, false); } private void check(final Object element) { ContentTypeTableViewer.this.viewer.setChecked(element, true); } }.start(); } }